package com.recordhistory.service;

import com.recordhistory.dao.PeriodDao;
import com.recordhistory.exception.ServiceException;
import com.recordhistory.model.Period;
import com.recordhistory.utils.CheckTool;
import com.recordhistory.utils.CommonTool;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author ：LX
 * 创建时间： 2019/6/13. 11:16
 * 地点：广州
 * 目的: 时期
 * 备注说明：
 */
@Service
public class PeriodService {

    @Resource
    private PeriodDao periodDao;


    /**
     * 新增 时期
     * @param period
     */
    @Transactional(rollbackFor = Exception.class)
    public void addPeriod(Period period){
        checkPeriod(period);

        period.setId(CommonTool.getUUId());
        period.setCreateDate(CommonTool.getTimestamp());
        period.setUpdateDate(CommonTool.getTimestamp());
        periodDao.insert(period);
    }

    /**
     * 更新 时期
     * @param period
     */
    @Transactional(rollbackFor = Exception.class)
    public void updPeriod(Period period){
        checkPeriod(period);

        if (CheckTool.checkNull(period.getId())){
            throw new ServiceException("ID不能为空");
        }
        period.setUpdateDate(CommonTool.getTimestamp());
        periodDao.updateById(period);
    }

    /**
     * 删除 时期
     * @param id 时期主键
     */
    @Transactional(rollbackFor = Exception.class)
    public void delPeriod(String id){
        if (CheckTool.checkNull(id)){
            throw new ServiceException("ID不能为空");
        }

        periodDao.deleteById(id);
    }


    /**
     * 检查 时期 必填数据
     * @param period 时期data
     */
    private void checkPeriod(Period period){
        if (period == null){
            throw new ServiceException("数据不能为空");
        }

        if (CheckTool.checkNull(period.getHistoryIdStart())){
            throw new ServiceException("当前时期对应的主干起始时间不能为空");
        }
        if (CheckTool.checkNull(period.getStart())){
            throw new ServiceException("开始时间不能为空");
        }
        //结束时间不需要校验，可能还未结束。结束如果为空字符串，要置空
        if (CheckTool.checkNull(period.getEnd())){
            period.setEnd(null);
        }

        if (CheckTool.checkNull(period.getName())){
            throw new ServiceException("时期名不能为空");
        }

        Period periodSQL = periodDao.selectPeriodByNameNotThis(period.getName(), period.getId());
        if (periodSQL != null){
            throw new ServiceException("已经存在相同的时期名");
        }
    }


    /**
     * 根据 历史主线ID 开始时间 查询时期
     * @param historyIdStart 历史主线ID
     * @return
     */
    public List<Period> selectPeriodByHistoryIdStart(String historyIdStart){
        return periodDao.selectPeriodByHistoryIdStart(historyIdStart);
    }

    /**
     * 查询全部的时期，并根据 开始时间 排序
     * @return
     */
    public List<Period> selectAllPeriodStartSort(){
        return periodDao.selectAllPeriodStartSort();
    }

    /**
     * 根据主键查询 时期
     * @param id 时期ID
     * @return
     */
    public Period selectById(String id){
        return periodDao.selectById(id);
    }


}
